/*
 * Copyright (c) 2021. Moses All Right Reserved
 */

package com.moses.design_patterns.proxy.dynamic_proxy.jdk;

import com.moses.design_patterns.proxy.static_proxy.interface_proxy.ISubject;
import com.moses.design_patterns.proxy.static_proxy.interface_proxy.RealSubject;

/**
 * @author Moses
 * @email shenhuohui@gmail.com
 * @date 2021/4/10 23:34
 */
public class Client {
    public static void main(String[] args) {
        // 动态代理类的核心是
        // 1. 实现 InvocationHandler 重写 invoke，完成对目标类的增强
        // 2. 使用反射包中的 Proxy.newProxyInstance(ClassLoader loader,
        //                                           Class<?>[] interfaces,
        //                                           InvocationHandler h)
        // 方法，使用反射生成目标类的代理类

        // 实例目标类
        ISubject subject = new RealSubject();
        // 获取代理类实例
        ISubject proxy = SubjectDynamicProxy.getProxy(subject,
                // 指定 Handler
                new DynamicProxyHandler(subject));
        proxy.method();

        System.out.println("=========");

        //把 Handler 和获取代理类实例合并在一个类中
        ISubject proxy2 = DynamicHandlerProxy.getProxy(subject);
        proxy2.method();

        // TODO: 验证Jdk动态代理能否代理未实现任何接口的类
    }
}
